package com.af.robot.config;

import com.af.robot.RobotApplication;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.UUID;

@Component
@Data
@Slf4j
public class ConfigThermalData {

    private final String configPath = new ApplicationHome(RobotApplication.class).getSource().getParentFile().toString() + "\\.robot";
    private final File systemFile = new File(configPath + "\\system.json");
    private final File dirFile = new File(configPath + "\\dirConfig.json");
    private final File passFile = new File(configPath + "\\password");


    private JSONObject systemEnvironment = null;
    private JSONObject DirConfig =null;
    private String defPass = null;

    public ConfigThermalData(){
        new Thread(()->{
            log.info("开始初始化配置---配置文件地址--" +configPath);
            File config = new File(configPath);
            if (config.exists()){
                if (systemFile.exists()){
                    loadSystemConfig();
                }else {
                    initSystemConfig();
                }

                if (dirFile.exists()){
                    loadDirConfig();
                }else {
                    initDirConfig();
                }

                if (passFile.exists()){
                    loadPassConfig();
                }else {
                    initPassConfig();
                }
            }else {
                if (config.mkdirs()){
                    String sets = "attrib +H \"" + config.getAbsolutePath() + "\"";
                    try {
                        Runtime.getRuntime().exec(sets);
                    } catch (IOException e) {
                        log.error("配置文件目录结构创建失败，退出系统");
                    }
                    initSystemConfig();
                    initDirConfig();
                    initPassConfig();
                }else {
                    log.error("配置文件目录结构创建失败，退出系统");
                    System.exit(0);
                }
            }
            log.info("系统启动初始化完成");
        },"init Thread").start();
    }




    /**
     * 初始化系统信息
     */
    private void initSystemConfig(){
        try {
            if (systemFile.createNewFile()){
                BufferedWriter out = new BufferedWriter(new FileWriter(systemFile));
                JSONObject info = getSystemInfo();
                out.write(info.toJSONString());
                out.close();
                systemEnvironment = info;
            }else {
                log.error("配置文件system创建失败，退出系统");
                System.exit(0);
            }
        } catch (IOException e) {
            log.error("配置文件信息写入失败，退出系统");
            System.exit(0);
        }

    }

    /**
     * 初始化目录配置
     */
    private void initDirConfig(){
        try {
            if(dirFile.createNewFile()){
                BufferedWriter out = new BufferedWriter(new FileWriter(dirFile));
                out.write("{}");
                out.close();
                DirConfig = new JSONObject();
            }else {
                log.error("配置文件dirConfig创建失败，退出系统");
                System.exit(0);
            }
        } catch (IOException e) {
            log.error("配置文件信息写入失败，退出系统");
            System.exit(0);
        }

    }

    /**
     * 初始化密码
     */
    private void initPassConfig(){
        try {
            if(passFile.createNewFile()){
                BufferedWriter out = new BufferedWriter(new FileWriter(passFile));
                defPass = UUID.randomUUID().toString().replace("-","");
                out.write(defPass);
                out.close();
            }else {
                log.error("配置文件Pass创建失败，退出系统");
                System.exit(0);
            }
        } catch (IOException e) {
            log.error("配置文件信息写入失败，退出系统");
            System.exit(0);
        }

    }



    /**
     * 保存系统信息
     */
    public void SaveSystemConfig(JSONObject system) {
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(systemFile));
            out.write(system.toJSONString());
            out.close();
            systemEnvironment = system;
        } catch (IOException e) {
            log.error("system配置文件信息更新失败");
        }

    }

    /**
     * 保存目录配置
     */
    public void SaveDirConfig(JSONObject dir) {
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(dirFile));
            out.write(dir.toJSONString());
            out.close();
            DirConfig = dir;
        } catch (IOException e) {
            log.error("dir配置文件信息更新失败");
        }

    }





    /**
     * 保存系统信息
     */
    public void loadSystemConfig() {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(systemFile));
            String str;
            StringBuilder inner = new StringBuilder();
            while ((str = in.readLine()) != null) {
                inner.append(str);
            }
            systemEnvironment = JSON.parseObject(inner.toString());
        } catch (FileNotFoundException e) {
            log.error("system配置文件不存在，读取失败");
            System.exit(0);
        } catch (IOException e) {
            log.error("system配置文件读取失败");
            System.exit(0);
        } catch (Exception e) {
            log.error("system配置文件内容转化Json失败");
            System.exit(0);
        }
    }

    /**
     * 读取配置文件
     */
    public void loadDirConfig() {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(dirFile));
            String str;
            StringBuilder inner = new StringBuilder();
            while ((str = in.readLine()) != null) {
                inner.append(str);
            }
            DirConfig = JSON.parseObject(inner.toString());
        } catch (FileNotFoundException e) {
            log.error("dir配置文件不存在，读取失败");
            System.exit(0);
        } catch (IOException e) {
            log.error("dir配置文件读取失败");
            System.exit(0);
        } catch (Exception e) {
            log.error("dir配置文件内容转化Json失败");
            System.exit(0);
        }
    }

    /**
     * 读取配置文件
     */
    public void loadPassConfig() {
        BufferedReader in = null;
        try {
            in = new BufferedReader(new FileReader(passFile));
            String str;
            StringBuilder inner = new StringBuilder();
            while ((str = in.readLine()) != null) {
                inner.append(str);
            }
            defPass = inner.toString();
        } catch (FileNotFoundException e) {
            log.error("密码文件不存在，读取失败");
            System.exit(0);
        } catch (IOException e) {
            log.error("密码文件读取失败");
            System.exit(0);
        } catch (Exception e) {
            log.error("密码文件内容获取失败");
            System.exit(0);
        }
    }


    /**
     * java.version	Java 运行时环境版本
     * java.vendor	Java 运行时环境供应商
     * java.vendor.url	Java 供应商的 URL
     * java.home	Java 安装目录
     * java.vm.specification.version	Java 虚拟机规范版本
     * java.vm.specification.vendor	Java 虚拟机规范供应商
     * java.vm.specification.name	Java 虚拟机规范名称
     * java.vm.version	Java 虚拟机实现版本
     * java.vm.vendor	Java 虚拟机实现供应商
     * java.vm.name	Java 虚拟机实现名称
     * java.specification.version	Java 运行时环境规范版本
     * java.specification.vendor	Java 运行时环境规范供应商
     * java.specification.name	Java 运行时环境规范名称
     * java.class.version	Java 类格式版本号
     * java.class.path	Java 类路径
     * java.library.path	加载库时搜索的路径列表
     * java.io.tmpdir	默认的临时文件路径
     * java.compiler	要使用的 JIT 编译器的名称
     * java.ext.dirs	一个或多个扩展目录的路径
     * os.name	操作系统的名称
     * os.arch	操作系统的架构
     * os.version	操作系统的版本
     * file.separator	文件分隔符（在 UNIX 系统中是“/”）
     * path.separator	路径分隔符（在 UNIX 系统中是“:”）
     * line.separator	行分隔符（在 UNIX 系统中是“/n”）
     * user.name	用户的账户名称
     * user.home	用户的主目录
     * user.dir	用户的当前工作目录
     * @return
     */
    private JSONObject getSystemInfo(){
        JSONObject res = new JSONObject();
        res.put("javaVersion",System.getProperty("java.version"));
        res.put("JVMVersion",System.getProperty("java.vm.version"));
        res.put("javaHome",System.getProperty("java.home"));
        res.put("javaIoTmpdir",System.getProperty("java.io.tmpdir"));
        res.put("osName",System.getProperty("os.name"));
        res.put("osArch",System.getProperty("os.arch"));
        res.put("osVersion",System.getProperty("os.version"));
        res.put("userDir",System.getProperty("user.dir"));
        res.put("userHome",System.getProperty("user.home"));

        return res;
    }


    public void changePWD(){
        BufferedWriter out = null;
        try {
            out = new BufferedWriter(new FileWriter(passFile));
            defPass = UUID.randomUUID().toString().replace("-","");
            out.write(defPass);
            out.close();
        } catch (IOException e) {
            log.error("更换密码出错，密码未修改");
        }

    }

    public void createLiveFile(){
        JSONArray tomcats = DirConfig.getJSONArray("tomcat");
        JSONArray nginxs = DirConfig.getJSONArray("nginx");
        for (int i = 0; i < tomcats.size(); i++) {
            JSONObject tomcat = tomcats.getJSONObject(i);
            File live = new File(tomcat.getString("af_path") + "\\webapps\\robotMonitor");
            if ( ! live.exists()){
                try {
                    live.mkdirs();
                    new File(tomcat.getString("af_path") + "\\webapps\\robotMonitor\\live.html").createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        for (int i = 0; i < nginxs.size(); i++) {
            JSONObject nginx = nginxs.getJSONObject(i);
            File live = new File(nginx.getString("af_path") + "\\html\\robotMonitor");
            if ( ! live.exists()){
                try {
                    live.mkdirs();
                    new File(nginx.getString("af_path") + "\\html\\robotMonitor\\live.html").createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
